<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Socket</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Socket"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Socket rootpage-Socket skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Socket</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<p>Ein <b>Socket</b> (von <a href="Englische_Sprache" title="Englische Sprache">engl.</a> <i>Sockel</i>, <i>Steckverbindung</i> oder <i>Steckdose</i>) ist ein vom <a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a> bereitgestelltes Objekt, das als Kommunikationsendpunkt dient. Ein <a href="Computerprogramm" title="Computerprogramm">Programm</a> verwendet Sockets, um Daten mit anderen Programmen auszutauschen. Das andere Programm kann sich dabei auf demselben Computer (<a href="Interprozesskommunikation" title="Interprozesskommunikation">Interprozesskommunikation</a>) oder einem anderen, via <a href="Netzwerk" title="Netzwerk">Netzwerk</a> erreichbaren Computer befinden. Die Kommunikation über Sockets erfolgt in der Regel <a href="Bidirektional" title="Bidirektional">bidirektional</a>, das heißt, über das Socket können Daten sowohl empfangen als auch gesendet werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Funktionsweise">Funktionsweise</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Allgemeines_Funktionsprinzip">Allgemeines Funktionsprinzip</h3></div>
<p>Sockets bilden eine plattformunabhängige <a href="Standard" title="Standard">standardisierte</a> Schnittstelle (<a href="Application_Programming_Interface" class="mw-redirect" title="Application Programming Interface">API</a>) zwischen der <a href="Netzwerkprotokoll" title="Netzwerkprotokoll">Netzwerkprotokoll</a>-<a href="Implementierung" title="Implementierung">Implementierung</a> des <a href="Betriebssystem" title="Betriebssystem">Betriebssystems</a> und der eigentlichen <a href="Anwendungssoftware" title="Anwendungssoftware">Anwendungssoftware</a>. Ein Computerprogramm fordert einen Socket vom Betriebssystem an. Das Betriebssystem hat die Aufgabe, alle benutzten Sockets sowie die zugehörigen Verbindungsinformationen zu verwalten.
</p>
<div class="mw-heading mw-heading3"><h3 id="Internet-Sockets">Internet-Sockets</h3></div>
<p>Internet-Sockets ermöglichen die Kommunikation mittels bestimmter <a href="Kommunikationsprotokoll" title="Kommunikationsprotokoll">Kommunikationsprotokolle</a>.
Generell kann man unterscheiden zwischen <b>Stream Sockets</b> und <b>Datagram Sockets</b>: Stream Sockets kommunizieren über einen <a href="Zeichen" title="Zeichen">Zeichen</a>-<a href="Datenstrom" title="Datenstrom">Datenstrom</a>, Datagram Sockets über einzelne Nachrichten. In der Netzwerkkommunikation verwenden Stream Sockets meist <a href="Transmission_Control_Protocol" title="Transmission Control Protocol">TCP</a>, Datagram Sockets üblicherweise <a href="User_Datagram_Protocol" title="User Datagram Protocol">UDP</a>. TCP ist verlässlicher, die Reihenfolge und Zustellung von Paketen werden garantiert (Prinzip: ganz oder gar nicht). UDP ist für bestimmte Aufgaben effizienter und flexibler, oft auch schneller (zeitlich) – Reihenfolge und Zustellung der Pakete werden jedoch nicht garantiert (weiterhin sind Duplikate möglich).
</p><p>Während Stream Sockets und Datagram Sockets den TCP- oder UDP-<a href="Header" title="Header">Header</a> eines <a href="Datenpaket" title="Datenpaket">Datenpakets</a> normalerweise verbergen und automatisch setzen, lassen <b>Raw Sockets</b> (<i>Raw</i>: roh) das Erstellen eigener TCP- und UDP-Header zu. Raw Sockets werden am ehesten in netzwerknahen Applikationen verwendet, z. B. für <a href="Router" title="Router">Router</a>, <a href="Sniffer" title="Sniffer">Packet-Sniffer</a> oder bei Packet-Injection.
</p><p>Ein Socket ist normalerweise die Verbindungsstelle zu einem bestimmten entfernten Programm, repräsentiert durch dessen Adressinformation (z. B. IP-Adresse und Portnummer). Dem Socket selbst ist natürlich auch die eigene Adressinformation zugeordnet. Eine Internet-Socket-<a href="Adresse" class="mw-disambig" title="Adresse">Adresse</a> der Familie AF_INET wird durch folgende Informationen repräsentiert:
</p>
<ul><li><code>sin_family</code>, das heißt der zugehörigen Adressfamilie des Netzwerks (z. B. AF_INET = Adressfamilie Internetadresse)</li>
<li>die Identifikationsnummer des <i><a href="Localhost" title="Localhost">localhost</a></i> / seiner 32-Bit-IP-Adresse</li>
<li>die Portnummer des <i>localhost</i> / 16 Bit</li></ul>
<p>Diese Informationen sind allerdings vom verwendeten <a href="Netzwerkprotokoll" title="Netzwerkprotokoll">Protokoll</a> abhängig. Typischerweise handelt es sich bei der Adressinformation im Internet um die <a href="IP-Adresse" title="IP-Adresse">IP-Adresse</a> und den <a href="Port_(Netzwerkadresse)" title="Port (Netzwerkadresse)">Port</a>. Bei <b>UNIX Domain Sockets</b> (<a href="#Sockets_und_Interprozesskommunikation">s. u.</a>) besteht die Identifikation aus einem Dateipfadnamen und der Adressfamilie AF_UNIX.
</p><p>Ein Server kann entweder auf Anfragen von einer bestimmten Adresse warten (und bindet sich von vornherein an diese Adresse) oder er wartet auf allen Adressen seines Rechners auf Anfragen. Dafür gibt es bei einigen Protokollen eine sogenannte <i>Wildcard-Adresse</i>, bei der ein oder mehrere Teile der Adressinformation nicht spezifisch sind. Im Beispiel von TCP/IP und UDP/IP ist bei einer Wildcard-Adresse nur die Port-Nummer relevant, das heißt, es wird eine spezielle (ungültige) IP-Adresse angegeben, um zu signalisieren, dass Verbindungen auf allen IP-Adressen akzeptiert werden sollen. Unter Linux ist diese Wildcardadresse <a href="0.0.0.0" title="0.0.0.0">0.0.0.0</a> (symbolische Konstante INADDR_ANY).
</p><p>Wenn der Server eine Anfrage von einem Client erhält, wird aus dem lauschenden („listening“) Server-Socket der in Verbindung stehende („connected“) Server-Socket abgeleitet: Der ursprüngliche Server-Socket bleibt erhalten und wartet weiterhin auf neue Verbindungen, während ein neuer, auf den bestimmten Client gerichteter Socket geöffnet wird, der nur für die Kommunikation mit diesem einen Client verwendet wird. Dieser bleibt solange bestehen, bis die Verbindung zum Client von einer der beiden Seiten beendet wird. Dieses Ableiten kann dazu genutzt werden, eine parallelisierte Serverarchitektur zu schaffen, in der sich der Server bei einer Anfrage <a href="Fork_(Unix)" title="Fork (Unix)">forkt</a> und ein Kindprozess die Anfrage selbst beantwortet.
</p><p>Das heißt, dass ein mit einem Client-Socket verbundener („connected“) Server-Socket genau die gleiche IP-Adresse und Port-Nummer trägt wie der lauschende („listen“) Server-Socket. Die Unterscheidung von gleichzeitigen Client-Verbindungen zum selben Server erfolgt daher durch das Paar von Server-Socket und Client-Socket. Dieses Paar muss zu jedem Zeitpunkt eindeutig auf jedem der beteiligten Kommunikationspartner sein.
Als Beispiel sei ein HTTP-Server gegeben, der auf Port 80 lauscht. Die Verbindungen des Servers zu verschiedenen Clients führt zu folgenden eindeutigen „Connected“-Socket-Paaren auf dem Server-Rechner:
</p><p>(<Server-IP>:80;<Client_A-IP>:<Client_A_Port_1>), (<Server-IP>:80;<Client_A-IP>:<Client_A_Port_2>), (<Server-IP>:80;<Client_B-IP>:<Client_B_Port_1>) usw.
</p>
<div class="mw-heading mw-heading2"><h2 id="Ablauf_der_Socket-Kommunikation">Ablauf der Socket-Kommunikation</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Stream_Sockets">Stream Sockets</h3></div>
<p><i>Client-seitig</i>:
</p>
<ol><li>Socket erstellen</li>
<li>erstellten Socket mit der Server-Adresse verbinden, von welcher Daten angefordert werden sollen</li>
<li>Senden und Empfangen von Daten</li>
<li>evtl. Socket herunterfahren (<code>shutdown()</code>, <code>close()</code>)</li>
<li>Verbindung trennen, Socket schließen</li></ol>
<p><i>Server-seitig</i>:
</p>
<ol><li>Server-Socket erstellen</li>
<li>Binden des Sockets an eine Adresse (Port), über welche Anfragen akzeptiert werden</li>
<li>auf Anfragen warten</li>
<li>Anfrage akzeptieren und damit ein neues Socket-Paar für diesen Client erstellen</li>
<li>Bearbeiten der Client-Anfrage auf dem neuen Client-Socket</li>
<li>Client-Socket wieder schließen.</li></ol>
<div class="mw-heading mw-heading3"><h3 id="Datagram_Sockets">Datagram Sockets</h3></div>
<p><i>Client-seitig</i>:
</p>
<ol><li>Socket erstellen</li>
<li>An Adresse senden</li></ol>
<p><i>Server-seitig</i>:
</p>
<ol><li>Socket erstellen</li>
<li>Socket binden</li>
<li>warten auf Pakete</li></ol>
<div class="mw-heading mw-heading2"><h2 id="Sockets_und_Interprozesskommunikation">Sockets und Interprozesskommunikation</h2></div>
<p><a href="Unixoides_System" title="Unixoides System">Unix-Betriebssysteme</a> verwenden zur lokalen <a href="Interprozesskommunikation" title="Interprozesskommunikation">Interprozesskommunikation</a> sogenannte <a href="POSIX_local_inter-process_communication_socket" class="mw-redirect" title="POSIX local inter-process communication socket">POSIX Local Inter-Process Communication Sockets</a> (auch <b>IPC Sockets</b>, von „inter-process communication sockets“, oder <b>Unix Domain Sockets</b>). Auch hier gibt es Datagram und Stream Sockets; da die Kommunikation aber im Kernel stattfindet, verhalten sich Stream und Datagram Sockets sehr ähnlich (z. B. besteht hier auch bei Datagram Sockets keine Gefahr von Datenverlust). Ein Unix Domain Socket wird als Spezialdatei im Dateisystem repräsentiert. Anstelle von IP-Adresse und Port-Nummer dient der vollständige Pfad des Sockets als eindeutige Identifikation (z. B. /var/run/snmpd.sock). Unix Domain Sockets haben für die IPC gegenüber Verbindungen, die die <a href="Loopback" title="Loopback">Loopback</a>-Schnittstelle nutzen, den Vorteil eines wesentlich höheren Durchsatzes.
</p><p>Alternativen zu Sockets in der Interprozesskommunikation sind <a href="Pipe_(Informatik)" title="Pipe (Informatik)">Pipes</a> oder <a href="Shared_Memory" title="Shared Memory">Shared Memory</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Geschichte">Geschichte</h2></div>
<p>Ein zentrales Designprinzip von <a href="Unix" title="Unix">Unix</a> ist: Alles ist eine Datei. Die vier am häufigsten benutzten Systemaufrufe für die Arbeit mit Dateien heißen: <code>open()</code> zum Öffnen, <code>read()</code> zum Lesen, <code>write()</code> zum Schreiben und <code>close()</code> zum Schließen. Sockets stellen die Umsetzung dieses Designprinzips dar.
</p><p>Ursprünglich entwickelt worden ist die Socket-<a href="Programmierschnittstelle" title="Programmierschnittstelle">API</a> 1983 für <a href="Berkeley_Software_Distribution" title="Berkeley Software Distribution">BSD-Unix</a>. Später ist die Spezifikation in den Standard <a href="POSIX" title="POSIX">POSIX</a> eingeflossen. Damit ist sie heute auf jedem POSIX-konformen Betriebssystem verfügbar. Auch andere Betriebssysteme wie Microsoft Windows (<a href="Winsock" title="Winsock">Winsock</a>) oder OS/2 haben die Socket-API übernommen. Die allgemeine Verbreitung von Sockets ist nicht nur dem Design von Sockets, sondern auch der allgemeinen Verfügbarkeit des Quellcodes dank der BSD-Lizenz geschuldet.
</p>
<div class="mw-heading mw-heading2"><h2 id="Verwendung_in_unterschiedlichen_Betriebssystemen">Verwendung in unterschiedlichen Betriebssystemen</h2></div>
<p><a href="Unix" title="Unix">Unix</a> und <a href="Unixoides_System" title="Unixoides System">unixartige Betriebssysteme</a> (wie <a href="Linux" title="Linux">Linux</a>) benutzen sehr häufig BSD-Sockets zur Netzwerkkommunikation. Zur lokalen <a href="Interprozesskommunikation" title="Interprozesskommunikation">Interprozesskommunikation</a> verwenden sie die oben beschriebenen <a href="Unix_Domain_Socket" title="Unix Domain Socket">Unix Domain Sockets</a> (die Teil des <a href="POSIX" title="POSIX">POSIX</a>-Standards sind) und mit denen Prozesse auf einfache Art und Weise miteinander kommunizieren können. Nach der Initialisierung des Sockets kann der Programmierer mit diesem wie mit einer Datei arbeiten.
</p><p><a href="Microsoft_Windows" title="Microsoft Windows">Windows</a> verwendet eine den BSD-Sockets nachempfundene sogenannte <a href="Winsock" title="Winsock">Windows Sockets API</a> (Winsock).
</p>
<div class="mw-heading mw-heading2"><h2 id="Socket-Programmierung">Socket-Programmierung</h2></div>
<div class="mw-heading mw-heading3"><h3 id="BSD_Sockets_API">BSD Sockets API</h3></div>
<p>Sowohl Unix Sockets als auch Windows Sockets basieren auf der 1983 veröffentlichten BSD Sockets API. Für die nachfolgenden Programmierbeispiele sind wichtige Funktionen dieser API hier kurz zusammengefasst:
</p>
<ul><li><code>socket()</code> Erzeugt ein neues Socket bestimmten Types und alloziert hierfür Systemressourcen. Für die Identifizierung gibt die Funktion eine eindeutige Zahl vom Typ Integer zurück.</li>
<li><code>bind()</code> Bindet den Socket an eine Socket Adressinformation, in der Regel an eine IP-Adresse und Port. Wird typischerweise auf Server-Seite benutzt.</li>
<li><code>listen()</code> Versetzt einen gebundenen STREAM (TCP/IP) Socket in einen Lauschen-Modus. Wird auf Server-Seite benutzt.</li>
<li><code>connect()</code> Macht die Adressinformation (z. B. IP-Adresse und Port) eines anderen Sockets bekannt. Ordnet dem Socket einen freien lokalen Port zu. Im Falle eines STREAM Sockets wird versucht eine neue TCP/IP-Verbindung zu etablieren. Wird auf Client-Seite benutzt.</li>
<li><code>accept()</code> Akzeptiert einen eingehenden Versuch (Anfrage), eine neue TCP/IP-Verbindung zu einem entfernten Client aufzubauen, und erzeugt im Erfolgsfall ein neues Socket, assoziiert mit dem Adress-Paar der Verbindung. Dieses neu erzeugte Socket wird von der Funktion zurückgegeben. Wird auf Server-Seite benutzt.</li>
<li><code>send()</code> und <code>recv()</code>, oder <code>write()</code> und <code>read()</code>, oder <code>sendto()</code> und <code>recvfrom()</code> Schreibt / liest Daten an / von Socket(s). Hinweis: Ein einmaliger Funktionsaufruf von <code>recv()</code> garantiert nicht den Empfang aller vom Sender mittels <code>send()</code> gesendeten Daten, insbesondere nicht bei STREAM Sockets.</li>
<li><code>close()</code> Veranlasst das Betriebssystem alle für das Socket allozierten Ressourcen freizugeben. Liegt ein TCP/IP Socket vor, wird die Verbindung beendet.</li></ul>
<div class="mw-heading mw-heading3"><h3 id="C">C</h3></div>
<p>Die abgeleitete POSIX-Sockets-API von Linux ist in C geschrieben. Ein Beispiel für einen TCP-Verbindungsaufbau eines Clients zu einem Server:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">sockfd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">socket</span><span class="p">(</span><span class="n">AF_INET</span><span class="p">,</span><span class="w"> </span><span class="n">SOCK_STREAM</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span><span class="w"> </span><span class="c1">// Erzeuge Socket</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">sockaddr_in</span><span class="w"> </span><span class="n">srv</span><span class="p">;</span>
<span class="n">memset</span><span class="p">(</span><span class="o">&</span><span class="n">srv</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">sockaddr_in</span><span class="p">));</span>
<span class="n">srv</span><span class="p">.</span><span class="n">sin_family</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">AF_INET</span><span class="p">;</span>
<span class="n">inet_pton</span><span class="p">(</span><span class="n">AF_INET</span><span class="p">,</span><span class="w"> </span><span class="s">"1.2.3.4"</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">srv</span><span class="p">.</span><span class="n">sin_addr</span><span class="p">);</span><span class="w"> </span><span class="c1">// Schreibe IP-Adresse des Servers in die sockaddr_in-Struktur</span>
<span class="n">srv</span><span class="p">.</span><span class="n">sin_port</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">htons</span><span class="p">(</span><span class="mi">1234</span><span class="p">);</span><span class="w"> </span><span class="c1">// Schreibe Port in Network-Byte-Order (Big Endian) in das Feld sin_port</span>
<span class="n">connect</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">sockaddr</span><span class="o">*</span><span class="p">)</span><span class="o">&</span><span class="n">srv</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">sockaddr_in</span><span class="p">));</span><span class="w"> </span><span class="c1">// Verbindung herstellen</span>
<span class="c1">// Ab jetzt kann mit write() und read() aus dem Socket gelesen und in das Socket geschrieben werden.</span>
<span class="p">[...]</span><span class="w"> </span><span class="c1">// Datenaustausch</span>
<span class="n">shutdown</span><span class="p">(</span><span class="n">sockfd</span><span class="p">,</span><span class="w"> </span><span class="n">SHUT_WR</span><span class="p">);</span><span class="w"> </span><span class="c1">// Sende ein EOF-Byte, sodass der Server beim nächsten read() als Rückgabewert 0 bekommt</span>
<span class="w"> </span><span class="c1">//und die Verbindung beenden kann</span>
<span class="n">close</span><span class="p">(</span><span class="n">sockfd</span><span class="p">);</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="C#"><span id="C.23"></span>C#</h3></div>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">// set IP adress and port for remote host</span>
<span class="n">IPAddress</span><span class="w"> </span><span class="n">ipAddress</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">IPAddress</span><span class="p">.</span><span class="n">Parse</span><span class="p">(</span><span class="s">"192.168.xxx.yyy"</span><span class="p">);</span>
<span class="n">IPEndPoint</span><span class="w"> </span><span class="n">ipEndPoint</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">IPEndPoint</span><span class="p">(</span><span class="n">ipAddress</span><span class="p">,</span><span class="w"> </span><span class="mi">9999</span><span class="p">);</span>
<span class="n">Socket</span><span class="w"> </span><span class="n">sock</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Socket</span><span class="p">(</span><span class="n">ipEndPoint</span><span class="p">.</span><span class="n">AddressFamily</span><span class="p">,</span><span class="w"> </span><span class="n">SocketType</span><span class="p">.</span><span class="n">Stream</span><span class="p">,</span><span class="w"> </span><span class="n">ProtocolType</span><span class="p">.</span><span class="n">Tcp</span><span class="p">);</span>
<span class="c1">// open socket</span>
<span class="n">sock</span><span class="p">.</span><span class="n">Connect</span><span class="p">(</span><span class="n">ipEndPoint</span><span class="p">);</span>
<span class="c1">// check if socket is connected</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">sock</span><span class="p">.</span><span class="n">Connected</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="c1">// endless loop</span>
<span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">// set receive buffer and length, is buffer big enough?</span>
<span class="w"> </span><span class="kt">byte</span><span class="p">[]</span><span class="w"> </span><span class="n">bytesReceived</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">byte</span><span class="p">[</span><span class="mi">1024</span><span class="p">];</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="c1">// send message</span>
<span class="w"> </span><span class="kt">byte</span><span class="p">[]</span><span class="w"> </span><span class="n">msg1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">byte</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
<span class="w"> </span><span class="c1">// ... set your bytes, ASCII or whatever</span>
<span class="w"> </span><span class="n">sock</span><span class="p">.</span><span class="n">Send</span><span class="p">(</span><span class="n">msg1</span><span class="p">,</span><span class="w"> </span><span class="n">msg1</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span><span class="w"> </span><span class="n">SocketFlags</span><span class="p">.</span><span class="n">None</span><span class="p">);</span>
<span class="w"> </span><span class="c1">// receive message</span>
<span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sock</span><span class="p">.</span><span class="n">Receive</span><span class="p">(</span><span class="n">bytesReceived</span><span class="p">,</span><span class="w"> </span><span class="n">bytesReceived</span><span class="p">.</span><span class="n">Length</span><span class="p">,</span><span class="w"> </span><span class="n">SocketFlags</span><span class="p">.</span><span class="n">None</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="n">sock</span><span class="p">.</span><span class="n">Shutdown</span><span class="p">(</span><span class="n">SocketShutdown</span><span class="p">.</span><span class="n">Both</span><span class="p">);</span>
<span class="w"> </span><span class="n">sock</span><span class="p">.</span><span class="n">Close</span><span class="p">();</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Java">Java</h3></div>
<p><a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> als <a href="Plattformunabh%C3%A4ngigkeit" title="Plattformunabhängigkeit">plattformunabhängige</a> <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a> unterstützt im Paket <code>java.net</code> unmittelbar die Socket-Programmierung. Das zeigt die Betriebssystemunabhängigkeit des Socket-Konzeptes. Die Implementierung der Sockets für die verschiedenen Plattformen (Linux, Windows, Spezialsysteme) erfolgt in der <a href="Klassenbibliothek" class="mw-redirect" title="Klassenbibliothek">Klassenbibliothek</a> der <a href="Java_Virtual_Machine" title="Java Virtual Machine">virtuellen Maschine</a>.
</p><p>Die Klassen für die Socket-Programmierung sind <code>Socket</code> und <code>ServerSocket</code>. Folgendes Kurzbeispiel zeigt die Verwendung:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span></span><span class="w"> </span><span class="n">ServerSocket</span><span class="w"> </span><span class="n">serverSocket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ServerSocket</span><span class="p">(</span><span class="n">port</span><span class="p">);</span><span class="w"> </span><span class="c1">//Serversocket mit bestimmter Port-Nummer erstellen</span>
<span class="w"> </span><span class="k">while</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">Socket</span><span class="w"> </span><span class="n">clientSocket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">serverSocket</span><span class="p">.</span><span class="na">accept</span><span class="p">();</span><span class="w"> </span><span class="c1">//auf Anfragen warten</span>
<span class="w"> </span><span class="n">InputStream</span><span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">clientSocket</span><span class="p">.</span><span class="na">getInputStream</span><span class="p">();</span><span class="w"> </span><span class="c1">//InputStream-Objekt öffnen</span>
<span class="w"> </span><span class="kt">byte</span><span class="o">[]</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">byte</span><span class="o">[</span><span class="mi">1024</span><span class="o">]</span><span class="p">;</span><span class="w"> </span><span class="c1">//Datenpuffer deklarieren (anlegen)</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">numBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="c1">//Variable für Anzahl der tatsächlich gelesenen Bytes</span>
<span class="w"> </span><span class="n">numBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">input</span><span class="p">.</span><span class="na">read</span><span class="p">(</span><span class="n">data</span><span class="p">);</span><span class="w"> </span><span class="c1">//Daten lesen</span>
<span class="w"> </span><span class="cm">/*** gelesene Daten verarbeiten ***/</span>
<span class="w"> </span><span class="n">clientSocket</span><span class="p">.</span><span class="na">close</span><span class="p">();</span><span class="w"> </span><span class="c1">//Verbindung schließen</span>
<span class="w"> </span><span class="p">}</span>
</pre></div>
<p>Weiterhin gibt es in der aktuellen Java-Version die Möglichkeit, Sockets über die NewIO-(nio)-Bibliothek anzusprechen.
Der Code ist etwas aufwändiger, kann jedoch schneller ausgeführt werden. Das Multiplexing mehrerer Sockets geschieht über einen so genannten Selector (vergleichbar dem Unix-Systemaufruf <i>select</i>).
</p>
<div class="mw-heading mw-heading3"><h3 id="Haskell">Haskell</h3></div>
<p>Die rein funktionale Programmiersprache <a href="Haskell_(Programmiersprache)" title="Haskell (Programmiersprache)">Haskell</a> bietet durch das Modul <code>Network</code> eine <a href="Plattformunabh%C3%A4ngigkeit" title="Plattformunabhängigkeit">plattformunabhängige</a> Möglichkeit zur Verwendung von Sockets. Das folgende Beispiel beinhaltet den vollständigen Code für einen sehr einfachen <a href="Server_(Software)" title="Server (Software)">Server</a> und einen korrespondierenden <a href="Client" title="Client">Client</a>. Der Client nimmt Textzeilen von der <a href="Standard-Datenstr%C3%B6me" title="Standard-Datenströme">Standardeingabe</a> entgegen und schickt diese über den Netzwerk-Socket an den Server. Dieser wiederum gibt die Textzeilen auf die <a href="Standard-Datenstr%C3%B6me" title="Standard-Datenströme">Standardausgabe</a> aus.
</p><p>Der hier gezeigte Server ist insofern einfach, als er z. B. eine sichere Beendigung wahrscheinlich nicht ermöglicht. Eine Lösungsmöglichkeit wird in <i>haskell.org</i><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> unter Verwendung von <a href="Transactional_Memory" class="mw-redirect" title="Transactional Memory">Software Transactional Memory (STM)</a> aufgezeigt.
</p>
<div class="mw-heading mw-heading4"><h4 id="Einfacher_Server">Einfacher Server</h4></div>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">module</span><span class="w"> </span><span class="nn">Main</span><span class="w"> </span><span class="kr">where</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Control.Concurrent</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Control.Monad</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">System.IO</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Network</span>
<span class="nf">main</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="kt">IO</span><span class="w"> </span><span class="nb">()</span>
<span class="nf">main</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">withSocketsDo</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="kr">do</span>
<span class="w"> </span><span class="n">theSocket</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">listenOn</span><span class="w"> </span><span class="p">(</span><span class="kt">PortNumber</span><span class="w"> </span><span class="mi">2048</span><span class="p">)</span>
<span class="w"> </span><span class="n">forever</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">acceptConnectionAndFork</span><span class="w"> </span><span class="n">theSocket</span><span class="w"> </span><span class="n">echoServer</span>
<span class="kr">type</span><span class="w"> </span><span class="kt">MessageHandler</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="kt">Handle</span><span class="p">,</span><span class="w"> </span><span class="kt">String</span><span class="p">,</span><span class="w"> </span><span class="kt">PortNumber</span><span class="p">)</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">IO</span><span class="w"> </span><span class="nb">()</span>
<span class="nf">acceptConnectionAndFork</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="kt">Socket</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">MessageHandler</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">IO</span><span class="w"> </span><span class="nb">()</span>
<span class="nf">acceptConnectionAndFork</span><span class="w"> </span><span class="n">theSocket</span><span class="w"> </span><span class="n">handler</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">do</span>
<span class="w"> </span><span class="n">connection</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">accept</span><span class="w"> </span><span class="n">theSocket</span>
<span class="w"> </span><span class="n">forkIO</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">handler</span><span class="w"> </span><span class="n">connection</span>
<span class="w"> </span><span class="n">return</span><span class="w"> </span><span class="nb">()</span>
<span class="nf">echoServer</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="kt">MessageHandler</span>
<span class="nf">echoServer</span><span class="w"> </span><span class="p">(</span><span class="n">handle</span><span class="p">,</span><span class="n">hostname</span><span class="p">,</span><span class="n">portnumber</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">do</span>
<span class="w"> </span><span class="n">putStrLn</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="s">"("</span><span class="o">++</span><span class="n">hostname</span><span class="o">++</span><span class="s">":"</span><span class="o">++</span><span class="n">show</span><span class="w"> </span><span class="n">portnumber</span><span class="o">++</span><span class="s">"): Open"</span>
<span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">hGetContents</span><span class="w"> </span><span class="n">handle</span>
<span class="w"> </span><span class="n">mapM_</span><span class="w"> </span><span class="n">putStrLn</span><span class="w"> </span><span class="p">[</span><span class="s">"("</span><span class="o">++</span><span class="n">hostname</span><span class="o">++</span><span class="s">":"</span><span class="o">++</span><span class="n">show</span><span class="w"> </span><span class="n">portnumber</span><span class="o">++</span><span class="s">"): Msg "</span><span class="o">++</span><span class="n">show</span><span class="w"> </span><span class="n">l</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">l</span><span class="ow"><-</span><span class="n">lines</span><span class="w"> </span><span class="n">c</span><span class="p">]</span>
<span class="w"> </span><span class="n">putStrLn</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="s">"("</span><span class="o">++</span><span class="n">hostname</span><span class="o">++</span><span class="s">":"</span><span class="o">++</span><span class="n">show</span><span class="w"> </span><span class="n">portnumber</span><span class="o">++</span><span class="s">"): Close"</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Einfacher_Client">Einfacher Client</h4></div>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span></span><span class="kr">module</span><span class="w"> </span><span class="nn">Main</span><span class="w"> </span><span class="kr">where</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Network</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">System.IO</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Control.Concurrent</span>
<span class="nf">main</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">IO</span><span class="w"> </span><span class="nb">()</span>
<span class="nf">main</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">withSocketsDo</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="kr">do</span>
<span class="w"> </span><span class="n">handle</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">connectTo</span><span class="w"> </span><span class="s">"localhost"</span><span class="w"> </span><span class="p">(</span><span class="kt">PortNumber</span><span class="w"> </span><span class="mi">2048</span><span class="p">)</span>
<span class="w"> </span><span class="n">input</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">getContents</span>
<span class="w"> </span><span class="n">sequence_</span><span class="w"> </span><span class="p">[</span><span class="kr">do</span>
<span class="w"> </span><span class="n">hPutStrLn</span><span class="w"> </span><span class="n">handle</span><span class="w"> </span><span class="n">l</span>
<span class="w"> </span><span class="n">hFlush</span><span class="w"> </span><span class="n">handle</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="n">l</span><span class="ow"><-</span><span class="n">lines</span><span class="w"> </span><span class="n">input</span><span class="p">]</span>
<span class="w"> </span><span class="n">hClose</span><span class="w"> </span><span class="n">handle</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Ruby">Ruby</h3></div>
<p>In Ruby stellt die Standardbibliothek <code>socket</code> ebenfalls plattformunabhängig eine Schnittstelle zur Programmierung von TCP-Sockets zur Verfügung.
</p><p>Ein sehr einfacher Server (mit Multithreading), der einen Text an den Client schickt:
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span></span><span class="nb">require</span><span class="w"> </span><span class="s1">'socket'</span>
<span class="n">port</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2048</span>
<span class="n">server</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">TCPServer</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
<span class="kp">loop</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="n">client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">server</span><span class="o">.</span><span class="n">accept</span>
<span class="w"> </span><span class="no">Thread</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">client</span><span class="p">)</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">c</span><span class="o">|</span>
<span class="w"> </span><span class="n">c</span><span class="o">.</span><span class="n">puts</span><span class="w"> </span><span class="s1">'Hello!'</span>
<span class="w"> </span><span class="n">c</span><span class="o">.</span><span class="n">close</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Python_3">Python 3</h3></div>
<p>Ein einfaches Programm, das über den Client Nachrichten an den Server schickt.
</p>
<div class="mw-heading mw-heading4"><h4 id="Server">Server</h4></div>
<div class="mw-highlight mw-highlight-lang-python3 mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">socket</span>
<span class="c1"># Server</span>
<span class="n">host</span> <span class="o">=</span> <span class="s2">"127.0.0.1"</span> <span class="c1"># IP adress of the Server</span>
<span class="n">port</span> <span class="o">=</span> <span class="mi">5000</span> <span class="c1"># Port used by the server</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">()</span>
<span class="n">s</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="n">s</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">client</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Connected to </span><span class="si">{</span><span class="n">addr</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
<span class="k">break</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Received from client: </span><span class="si">{</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="n">client</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Client">Client</h4></div>
<div class="mw-highlight mw-highlight-lang-python3 mw-content-ltr" dir="ltr"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">socket</span>
<span class="n">host</span> <span class="o">=</span> <span class="s2">"127.0.0.1"</span> <span class="c1"># IP adress of the Server</span>
<span class="n">port</span> <span class="o">=</span> <span class="mi">5000</span> <span class="c1"># Port used by server</span>
<span class="n">s</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">()</span>
<span class="n">s</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s2">"Message -> "</span><span class="p">))</span>
<span class="n">s</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">encode</span><span class="p">())</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Received from server: </span><span class="si">{</span><span class="n">data</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Node.js">Node.js</h3></div>
<p>In Node.js ermöglicht das Standardmodul „net“ die Programmierung von TCP-Sockets.
</p>
<div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span></span><span class="kd">var</span><span class="w"> </span><span class="nx">net</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">'net'</span><span class="p">);</span>
<span class="kd">var</span><span class="w"> </span><span class="nx">server</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">net</span><span class="p">.</span><span class="nx">createServer</span><span class="p">(</span><span class="kd">function</span><span class="w"> </span><span class="p">(</span><span class="nx">socket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="nx">socket</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="s1">'Echo server\r\n'</span><span class="p">);</span>
<span class="w"> </span><span class="nx">socket</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">socket</span><span class="p">);</span>
<span class="p">});</span>
<span class="nx">server</span><span class="p">.</span><span class="nx">listen</span><span class="p">(</span><span class="mf">1337</span><span class="p">,</span><span class="w"> </span><span class="s1">'127.0.0.1'</span><span class="p">);</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://docs.freebsd.org/44doc/psd/20.ipctut/paper.pdf">UNIX Programmer’s Supplementary Documents (PSD: 20-1)</a> (PDF; englisch)</li>
<li><a rel="nofollow" class="external text" href="https://docs.python.org/3/howto/sockets.html">Socket-Programmierung in Python</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://wiki.haskell.org/Concurrency_demos/Graceful_exit">Realistisches Beispiel für die Konstruktion eines Socket-Servers mit sicherer Beendigung in Haskell</a></li>
<li><a rel="nofollow" class="external text" href="https://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Sockets.html"><i>Sockets</i>.</a> GNU-info-Page (englisch)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://wiki.haskell.org/Concurrency_demos/Graceful_exit"><i>Concurrency demos/Graceful exit</i></a> auf wiki.haskell.org</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-07-20" href="https://de.wikipedia.org/wiki/?title=Socket&oldid=258095237">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>